package grupobbva.pe.operhc.util;

import grupobbva.pe.operhc.domain.Cliente;
import grupobbva.pe.operhc.domain.Contrato;
import grupobbva.pe.operhc.domain.Parametro;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import pe.com.grupobbva.ps9.BodyRQ;
import pe.com.grupobbva.ps9.BodyRS;
import pe.com.grupobbva.ps9.HeaderRQ;
import pe.com.grupobbva.ps9.HeaderRS;
import pe.com.grupobbva.ps9.MS_PS9_Service;
import pe.com.grupobbva.ps9.MS_PS9_ServiceLocator;
import pe.com.grupobbva.ps9.Ps9RQ;
import pe.com.grupobbva.ps9.Ps9RS;
import static grupobbva.pe.operhc.util.Constant.FiltroCliente;

public class PS9Builder {
	
	public static Logger logger = Logger.getLogger(PS9Builder.class);

	public static String pruebasMultiples(String ih, String me) throws Exception {
		String retorna = "";
		
		MS_PS9_Service service = new MS_PS9_ServiceLocator();
		
		HeaderRQ headerRQ = new HeaderRQ();
		headerRQ.setDist_qname_in(Utilities.QUEUE_DIST_IN);
		headerRQ.setDist_qname_out(Utilities.QUEUE_DIST_OUT);
		headerRQ.setHost_qmanager(Utilities.QMGR_HOST);
		headerRQ.setHost_qname_out(Utilities.QUEUE_HOST_OUT);

		BodyRQ bodyRQ = new BodyRQ();
		bodyRQ.setOPCION("2");
		bodyRQ.setHOST_RQ("");
		bodyRQ.setIH(ih);
		bodyRQ.setME(me);
		
		
		Ps9RQ request = new Ps9RQ();
		request.setHeader(headerRQ);
		request.setBody(bodyRQ);
		Ps9RS response = service.getMS_PS9_Port().sendHost(request);
		HeaderRS headerRS = response.getHeader();
		BodyRS bodyRS = response.getBody();
		
		//logger.info(headerRS.getCcsid());
		if (bodyRS != null) {
			String lineInfo = bodyRS.getTramaRSBLOB();
			retorna = convert(hexStringToStringArray(lineInfo), Utilities.ENCODING_HOST);
				//logger.info(bodyRS.getTramaRS());
				//logger.info(bodyRS.getTramaRSBLOB());
				//logger.info(retorna);
		}
		return retorna;
	}
	
	public static String convert(String[] hexDigits, String charsetName){
	    byte[] bytes = new byte[hexDigits.length];

	    for(int i=0;i<bytes.length;i++)
	        bytes[i] = Integer.decode("0x"+hexDigits[i]).byteValue();

	    String result;
	    result = new String(bytes, Charset.forName(charsetName));
	    return result;
	}
	
	public static String[] hexStringToStringArray(String lineInfo) {
		char[] caracteres = lineInfo.toCharArray();
		int tamanho = (int) (caracteres.length/2);
		
		String[] valoresHex = new String[tamanho];
		int a = 0;
		for (int i=0; i< caracteres.length; i=i+2) {
			valoresHex[a] = caracteres[i]+""+caracteres[i+1];
			a++;
		}
		return valoresHex;
	}
	
	public static String pruebaGenerica(String ih, String me) throws Exception {
		long ini = System.currentTimeMillis();
		String respuesta = pruebasMultiples(ih, me);
		logger.info(System.currentTimeMillis() - ini + " ms");
		return respuesta;
	}
	
	public static List<Map<String, String>> callMP1B(String codigoUsuario, String tipoTarjetaRq) throws Exception {
		List<Map<String, String>> listaRangos = new ArrayList<Map<String,String>>();
		String ih = "26"+Utilities.TERMINAL_LOGICO+"    "+Utilities.TERMINAL_CONTABLE+"    "+StringUtils.rightPad(codigoUsuario, 8)+"00000003MP1B    000012611OOHNR";
		String me = "0047B               "+tipoTarjetaRq+"                              ";
		logger.info("<IH>"+ih+"</IH><ME>"+me+"</ME>");
		String respuesta = pruebaGenerica(ih, me);
		String tipoTarjetaRs = StringUtils.substring(respuesta, 55, 57);
		if(tipoTarjetaRq.equalsIgnoreCase(tipoTarjetaRs)) {
			
			int posicion = 60;
			String fechaCierre = StringUtils.substring(respuesta, posicion, posicion+2);
			String fechaCargo = StringUtils.substring(respuesta, posicion+5, posicion+7);
			Map<String, String> rango = new HashMap<String, String>();
			rango.put("id", "1");
			rango.put("rango", "RANGO 1");
			rango.put("fechaCierre", fechaCierre);
			rango.put("fechaCargo", fechaCargo);
			listaRangos.add(rango);
			posicion+=10;
			rango = new HashMap<String, String>();
			fechaCierre = StringUtils.substring(respuesta, posicion, posicion+2);
			fechaCargo = StringUtils.substring(respuesta, posicion+5, posicion+7);
			rango.put("id", "2");
			rango.put("rango", "RANGO 2");
			rango.put("fechaCierre", fechaCierre);
			rango.put("fechaCargo", fechaCargo);
			listaRangos.add(rango);
			posicion+=10;
			rango = new HashMap<String, String>();
			fechaCierre = StringUtils.substring(respuesta, posicion, posicion+2);
			fechaCargo = StringUtils.substring(respuesta, posicion+5, posicion+7);
			rango.put("id", "3");
			rango.put("rango", "RANGO 3");
			rango.put("fechaCierre", fechaCierre);
			rango.put("fechaCargo", fechaCargo);
			listaRangos.add(rango);
		}
		return listaRangos;
	}
	
	public static Cliente callPE20(String codigoUsuario, String cuentaCargoRq) throws Exception {
		Cliente cliente = new Cliente();
		String ih = "26"+Utilities.TERMINAL_LOGICO+"    "+Utilities.TERMINAL_CONTABLE+"    "+StringUtils.rightPad(codigoUsuario, 8)+"00000003PE20    000086411OOHNR";
		String me = StringUtils.rightPad("0785B               "+cuentaCargoRq, 790);
		logger.info("<IH>"+ih+"</IH><ME>"+me+"</ME>");
		String respuesta = pruebaGenerica(ih, me);
		String cuentaCargoRs = StringUtils.substring(respuesta, 55, 75);
		if(Contrato.validarSinDigitosChequeo(cuentaCargoRq, cuentaCargoRs)) {
			String codigoCentral = StringUtils.substring(respuesta, 375, 383);
			String tipoDocumento = StringUtils.substring(respuesta, 386, 387);
			String numeroDocumento = StringUtils.substring(respuesta, 390, 401).trim();
			cliente.setCodigoCentral(codigoCentral);
			cliente.setTipoDocumento(tipoDocumento);
			cliente.setNumeroDocumento(numeroDocumento);
		}
		logger.info(respuesta);
		return cliente;
	}
	
	public static String callQSP5(String codigoUsuario, String registro) throws Exception {
		String ih = "26"+Utilities.TERMINAL_LOGICO+"    "+Utilities.TERMINAL_CONTABLE+"    "+StringUtils.rightPad(codigoUsuario, 8)+"00000003QSP5    000008711OOHSR";
		String me = "0008C"+StringUtils.rightPad(registro, 8);
		logger.info("<IH>"+ih+"</IH><ME>"+me+"</ME>");
		String respuesta = pruebaGenerica(ih, me);
		String terminalCLIO = StringUtils.substring(respuesta, 347, 351);
		logger.info(terminalCLIO);
		return terminalCLIO;
	}
	
	public static String callHY60(String codigoUsuario, String opcion) throws Exception {
		String ih = "26"+Utilities.TERMINAL_LOGICO+"    "+Utilities.TERMINAL_CONTABLE+"    "+StringUtils.rightPad(codigoUsuario, 8)+"00000004HY60    000115011OOHNR";
		String me = StringUtils.rightPad("1071B               HY   "+opcion, 1076);
		logger.info("<IH>"+ih+"</IH><ME>"+me+"</ME>");
		String respuesta = pruebaGenerica(ih, me);
		logger.info(respuesta);
		return respuesta;
	}
	
	public static List<Parametro> obtenerParametros(String codigoUsuario) throws Exception {
		List<Parametro> lstParamBuro = new ArrayList<Parametro>();
		for (FiltroCliente filtroCliente : FiltroCliente.values()) {
			String respuesta = callHY60(codigoUsuario, filtroCliente.getFiltroCliente());
			logger.info(StringUtils.substring(respuesta, 168, 171));
			
			switch (filtroCliente) {
			case GRUPO_BURO:
				int a = 1;
				for(int i=203; i<1217; i=i+78){
					String codParametro = StringUtils.substring(respuesta, i, i+2);
					String valParametro = StringUtils.substring(respuesta, i+28, i+29);
					if(StringUtils.isNotBlank(codParametro)) {
						Parametro paramBuro = new Parametro();
						paramBuro.setCodParametroHdn(codParametro);
						paramBuro.setCodParametro(codParametro);
						paramBuro.setDesParametro(codParametro);
						paramBuro.setValParametro(valParametro);
						paramBuro.setCodParamHost(codParametro);
						paramBuro.setOrdValParametro(""+(a++));
						paramBuro.setCodTipoParametro("VALBURO");
						paramBuro.setDesTipoParametro("Buro");
						paramBuro.setAtributo("valorBuro");
						lstParamBuro.add(paramBuro);
					}
				}
				break;
			case CLASIFICACION_BANCO:
				
				break;
			case CLASIFICACION_SSFF:
				
				break;
			case RELEVANCIA_PUBLICA:
				
				break;
			case PORCENTAJE_ENDEUDAMIENTO:
				
				break;
			default:
				break;
			}
			/*
			
			*/
		}

		return lstParamBuro;
	}
	
	
	public static void main(String[] args) throws Exception {
		Utilities.BROKER_SOCKET = "118.180.36.26:7820";
		//Utilities.BROKER_SOCKET = "118.180.36.28:7802";
		Utilities.TERMINAL_LOGICO = "7%50";		//RangoTerminal.getTerminalLogico("7%50-7%59");
		Utilities.TERMINAL_CONTABLE = "7%50";
		
		Utilities.QUEUE_DIST_IN = "QLT.OHC.RESP";
		Utilities.QUEUE_DIST_OUT = "QRT.OHC.ENVIO.MPD1";
		Utilities.QMGR_HOST = "MPD1";
		Utilities.QUEUE_HOST_OUT = "QRT.OHC.RESP.QMPTINT9";
		Utilities.ENCODING_HOST = "UTF-8";	
		/*
		List<Map<String, String>> listaRangos = callMP1B("P007397", "O5");
		System.out.println("------------------------------");
		logger.info(listaRangos);
		System.out.println("------------------------------");
		*/
		//00110130240201008708
		//logger.info(callPE20("P007397", "00110130240201008708"));
		logger.info(callQSP5("P007397", "P017073"));
		
		logger.info(obtenerParametros("P017073"));		
	}

}